package com.itheima.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.PermissionDao;
import com.itheima.dao.RoleDao;
import com.itheima.dao.UserDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;
import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Set;

@Service(interfaceClass = UserService.class)
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;
    @Autowired
    private RoleDao roleDao;
    @Autowired
    private PermissionDao permissionDao;

    @Override
    public User findByUsername(String username) {
        //先通过userDao查询出用户的基本信息
        User user = userDao.findByUsername(username);

        //判断是否存在此用户
        if(user == null){
            return null;
        }

        //再通过用户的id查询此用户包含的角色信息
        Integer userId = user.getId();
        Set<Role> roles = roleDao.findByUserId(userId);
        //此时的roles集合中只包括角色的基本信息，不包括所包含的权限信息
        for (Role role : roles) {
            //再根据角色的id查询此角色包括的所有权限信息
            Integer roleId = role.getId();
            Set<Permission> permissions = permissionDao.findByRoleId(roleId);
            role.setPermissions(permissions);
        }
        user.setRoles(roles);

        return user;
    }

    /**
     * 分页查询所有的角色信息
     * @param queryPageBean 分页条件
     * @return
     */
    @Override
    public PageResult findAll(QueryPageBean queryPageBean) {
        //开启分页
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        Page<User> page= userDao.findAll(queryPageBean.getQueryString());

        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 创建用户信息
     * @param roleIds 用户拥有的角色id数组
     * @param user 用户的基本信息
     */
    @Override
    public void saveUser(int[] roleIds, User user) {
        if (user.getPassword()==null || user.getPassword().length() < 8){
            throw new RuntimeException("密码为空,或者密码长度不足8位长度");
        }

        //0. 先加密密码
        BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
        String encode = encoder.encode(user.getPassword());
        user.setPassword(encode);
        // 1.先保存基本信息 拿到新增用户的主键
        userDao.saveBasic(user);
        // 2. 准备存中间表的数据
        HashMap<String, Integer> map = new HashMap<>();
        map.put("user_id", user.getId());
        if (roleIds!=null && roleIds.length>0){
            for (int i = 0; i < roleIds.length; i++) {
                map.put("role_id", roleIds[i]);
                userDao.saveMiddle(map);
            }
        }
    }

    /**
     * 查询所以角色信息,不分页
     * @return
     */
    public List<Role> findAllNoPagination() {
        Page<Role> all = roleDao.findAll("");

        return all.getResult();
    }

    /**
     * 根据id查询用户的基本信息
     * @param id
     * @return
     */
    @Override
    public User selectUserById(int id) {

        return userDao.selectUserById(id);
    }

    /**
     * 根据用户id查用户拥有的角色的id数组
     * @param id
     * @return
     */
    @Override
    public Integer[] selectMiddleById(int id) {


        return userDao.selectMiddleById(id);
    }

    /**
     * 修改角色信息
     * @param roleIds
     * @param user
     */
    @Override
    public void updateUser(int[] roleIds, User user) {
        // 先修改基本信息
        userDao.updateUserBasic(user);
        //在删除中间表的联系
        userDao.deleteUserMiddle(user.getId());
        //准备添加中间表的数据
        HashMap<String, Integer> map = new HashMap<>();
        map.put("user_id", user.getId());
        if (roleIds!=null && roleIds.length>0){
            for (int i = 0; i < roleIds.length; i++) {
                map.put("role_id", roleIds[i]);
                userDao.saveMiddle(map);
            }
        }
    }

    /**
     * 根据用户id删除用户信息
     * @param id
     */
    @Override
    public void deleteUserById(int id) {
        //先删除中间表
        userDao.deleteUserMiddle(id);
        //在删除基本信息
        userDao.deleteUserBasic(id);
    }
}
